#include "ClientReportIntern.h"
#include "ui_ClientReportIntern.h"

extern QSqlDatabase enjoylifedb;

ClientReportIntern::ClientReportIntern(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientReportIntern)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Configuración listado interno de clientes");

    // Se setea el nombre del reporte por defecto
    QDate date = QDate::currentDate();
    QTime time = QTime::currentTime();
    QString str;
    str.append("Listado-interno-");
    str.append(QString::number(date.day())).append("-").append(QString::number(date.month()));
    str.append("-").append(QString::number(date.year())).append("-");
    str.append(QString::number(time.hour())).append("-");
    str.append(QString::number(time.minute()));
    ui->report_name->setText(str);

    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

ClientReportIntern::~ClientReportIntern()
{
    delete ui;
}

void ClientReportIntern::on_select_dir_btn_clicked()
{
    report_path = QFileDialog::getExistingDirectory(this, "Seleccione directorio de salida",QDir::current().homePath(),QFileDialog::ShowDirsOnly|QFileDialog::ReadOnly);
}

void ClientReportIntern::on_guardarBtn_clicked()
{
    if (ui->report_name->text().isEmpty()) {
        QMessageBox::critical(0,"Error","Se debe ingresar el nombre del reporte");
        return;
    }

    if (report_path.isNull()) {
        QMessageBox::critical(0,"Error","Se debe elegir el directorio del reporte");
        return;
    }

    QPrinter* print = new QPrinter(QPrinter::HighResolution);
    print->setOutputFormat(QPrinter::PdfFormat);
    QTextDocument *document = new QTextDocument;
    QTextCursor cursor(document);
    cursor.movePosition(QTextCursor::Start);
    cursor.insertBlock();

    QTextImageFormat picture1;
    picture1.setName("://Images/membrete recibo-15.png");
    picture1.setWidth(630);
    picture1.setHeight(120);
    cursor.insertImage(picture1,QTextFrameFormat::InFlow);

    cursor.insertBlock();
    cursor.insertBlock();

    QTextCharFormat date_format;
    date_format.setFont(QFont("Helvetica57-Condensed"));
    date_format.setFontItalic(true);

    cursor.insertText(dateToString(QDate::currentDate()),date_format);

    cursor.insertBlock();
    cursor.insertBlock();

    QSqlQuery* query = new QSqlQuery(enjoylifedb);
    if (! query->exec("select nro_cliente, razon_social from cliente where estado is null order by razon_social")) {
        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
        return;
    }

    if (query->size() <= 0) {
        QMessageBox::critical(this,"Error!", "No se pueden recuperar los registros. Intente nuevamente");
        return;
    }

    QTextCharFormat char_format;
    QFont cell_font;
    cell_font.setFamily("Helvetica57-Condensed");
    char_format.setFont(cell_font);

    while (query->next()) {

        QString client_text;
        client_text.append(query->value(0).toString()).append(" - ");
        client_text.append(query->value(1).toString());

        cursor.insertText(client_text,char_format);
        cursor.insertBlock();
        cursor.movePosition(QTextCursor::NextBlock);

    }

    cursor.movePosition(QTextCursor::End);

    QString path;
    path.append(report_path).append("/").append(ui->report_name->text()).append(".pdf");
    print->setOutputFileName(path);
    document->print(print);

    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, "Creación Exitosa", "El reporte se ha creado exitosamente. Quiere abrir el reporte ahora?",
                                  QMessageBox::Yes|QMessageBox::No);

    if (reply == QMessageBox::Yes) {
        if (! QDesktopServices::openUrl(QUrl(path))) {
            QMessageBox::information(this,"Información", "No se puede abrir el reporte");
            return;
        }
    }
    close();
}

QString ClientReportIntern::dateToString(QDate date)
{
    QString str;
    str.append(QString::number(date.day())).append(" de ");
    switch (date.month()) {
    case 1:
        str.append("Enero");
        break;
    case 2:
        str.append("Febrero");
        break;
    case 3:
        str.append("Marzo");
        break;
    case 4:
        str.append("Abril");
        break;
    case 5:
        str.append("Mayo");
        break;
    case 6:
        str.append("Junio");
        break;
    case 7:
        str.append("Julio");
        break;
    case 8:
        str.append("Agosto");
        break;
    case 9:
        str.append("Septiembre");
        break;
    case 10:
        str.append("Octubre");
        break;
    case 11:
        str.append("Noviembre");
        break;
    case 12:
        str.append("Diciembre");
        break;
    }
    str.append(" de ").append(QString::number(date.year()));
    return str;
}
